<!DOCTYPE HTML>
<html lang="zh-CN">


<head>
    <meta charset="utf-8">
    <meta name="keywords" content="生成树协议, 十二惊惶的gitee">
    <meta name="description" content="生成树协议[TOC]
生成树技术概述：前言以太网交换网络中为了进行链路备份，提高网络可靠性，通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路，引发广播风暴以及MAC地址表不稳定等故障现象，从而导致用户通信质量较差，甚至通信中断。为">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="renderer" content="webkit|ie-stand|ie-comp">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="referrer" content="no-referrer-when-downgrade">
    <!-- Global site tag (gtag.js) - Google Analytics -->


    <title>生成树协议 | 十二惊惶的gitee</title>
    <link rel="icon" type="image/png" href="/shier_jinghuang/favicon.png">
    


    <!-- bg-cover style     -->



<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/awesome/css/all.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/materialize/materialize.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/aos/aos.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/animate/animate.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/lightGallery/css/lightgallery.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/css/matery.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/css/my.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/css/dark.css" media="none" onload="if(media!='all')media='all'">




    <link rel="stylesheet" href="/shier_jinghuang/libs/tocbot/tocbot.css">
    <link rel="stylesheet" href="/shier_jinghuang/css/post.css">




    



    <script src="/shier_jinghuang/libs/jquery/jquery-3.6.0.min.js"></script>

<meta name="generator" content="Hexo 5.4.0"><link rel="alternate" href="/shier_jinghuang/atom.xml" title="十二惊惶的gitee" type="application/atom+xml">
</head>


<body>
    <header class="navbar-fixed">
    <nav id="headNav" class="bg-color nav-transparent">
        <div id="navContainer" class="nav-wrapper container">
            <div class="brand-logo">
                <a href="/shier_jinghuang/" class="waves-effect waves-light">
                    
                    <img src="/shier_jinghuang/medias/1.jpg" class="logo-img" alt="LOGO">
                    
                    <span class="logo-span">十二惊惶的gitee</span>
                </a>
            </div>
            

<a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a>
<ul class="right nav-menu">
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/" class="waves-effect waves-light">
      
      <i class="fas fa-home" style="zoom: 0.6;"></i>
      
      <span>首页</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/tags" class="waves-effect waves-light">
      
      <i class="fas fa-tags" style="zoom: 0.6;"></i>
      
      <span>标签</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/categories" class="waves-effect waves-light">
      
      <i class="fas fa-bookmark" style="zoom: 0.6;"></i>
      
      <span>分类</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/archives" class="waves-effect waves-light">
      
      <i class="fas fa-archive" style="zoom: 0.6;"></i>
      
      <span>归档</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/about" class="waves-effect waves-light">
      
      <i class="fas fa-user-circle" style="zoom: 0.6;"></i>
      
      <span>关于</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/contact" class="waves-effect waves-light">
      
      <i class="fas fa-comments" style="zoom: 0.6;"></i>
      
      <span>留言板</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/friends" class="waves-effect waves-light">
      
      <i class="fas fa-address-book" style="zoom: 0.6;"></i>
      
      <span>友情链接</span>
    </a>
    
  </li>
  
  <li>
    <a href="#searchModal" class="modal-trigger waves-effect waves-light">
      <i id="searchIcon" class="fas fa-search" title="搜索" style="zoom: 0.85;"></i>
    </a>
  </li>
  <li>
    <a href="javascript:;" class="waves-effect waves-light" onclick="switchNightMode()" title="深色/浅色模式" >
      <i id="sum-moon-icon" class="fas fa-sun" style="zoom: 0.85;"></i>
    </a>
  </li>
</ul>


<div id="mobile-nav" class="side-nav sidenav">

    <div class="mobile-head bg-color">
        
        <img src="/shier_jinghuang/medias/1.jpg" class="logo-img circle responsive-img">
        
        <div class="logo-name">十二惊惶的gitee</div>
        <div class="logo-desc">
            
            犁牛之子骍且角，虽欲勿用，山川其舍诸
            
        </div>
    </div>

    <ul class="menu-list mobile-menu-list">
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-home"></i>
			
			首页
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/tags" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-tags"></i>
			
			标签
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/categories" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-bookmark"></i>
			
			分类
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/archives" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-archive"></i>
			
			归档
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/about" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-user-circle"></i>
			
			关于
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/contact" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-comments"></i>
			
			留言板
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/friends" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-address-book"></i>
			
			友情链接
		</a>
          
        </li>
        
        
        <li><div class="divider"></div></li>
        <li>
            <a href="https://gitee.com/Im-so-scared-2/shier_jinghuang" class="waves-effect waves-light" target="_blank">
                <i class="fab fa-github-square fa-fw"></i>十二惊惶
            </a>
        </li>
        
    </ul>
</div>


        </div>

        
            <style>
    .nav-transparent .github-corner {
        display: none !important;
    }

    .github-corner {
        position: absolute;
        z-index: 10;
        top: 0;
        right: 0;
        border: 0;
        transform: scale(1.1);
    }

    .github-corner svg {
        color: #0f9d58;
        fill: #fff;
        height: 64px;
        width: 64px;
    }

    .github-corner:hover .octo-arm {
        animation: a 0.56s ease-in-out;
    }

    .github-corner .octo-arm {
        animation: none;
    }

    @keyframes a {
        0%,
        to {
            transform: rotate(0);
        }
        20%,
        60% {
            transform: rotate(-25deg);
        }
        40%,
        80% {
            transform: rotate(10deg);
        }
    }
</style>

<a href="https://gitee.com/Im-so-scared-2/shier_jinghuang" class="github-corner tooltipped hide-on-med-and-down" target="_blank"
   data-tooltip="十二惊惶" data-position="left" data-delay="50">
    <svg viewBox="0 0 250 250" aria-hidden="true">
        <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
        <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
              fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
        <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
              fill="currentColor" class="octo-body"></path>
    </svg>
</a>
        
    </nav>

</header>

    



<div class="bg-cover pd-header post-cover" style="background-image: url('/shier_jinghuang/medias/featureimages/1.jpg')">
    <div class="container" style="right: 0px;left: 0px;">
        <div class="row">
            <div class="col s12 m12 l12">
                <div class="brand">
                    <h1 class="description center-align post-title">生成树协议</h1>
                </div>
            </div>
        </div>
    </div>
</div>




<main class="post-container content">

    
    <div class="row">
    <div id="main-content" class="col s12 m12 l9">
        <!-- 文章内容详情 -->
<div id="artDetail">
    <div class="card">
        <div class="card-content article-info">
            <div class="row tag-cate">
                <div class="col s7">
                    
                    <div class="article-tag">
                        
                            <a href="/shier_jinghuang/tags/HCIP/">
                                <span class="chip bg-color">HCIP</span>
                            </a>
                        
                    </div>
                    
                </div>
                <div class="col s5 right-align">
                    
                    <div class="post-cate">
                        <i class="fas fa-bookmark fa-fw icon-category"></i>
                        
                            <a href="/shier_jinghuang/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B%E7%9B%B8%E5%85%B3/" class="post-category">
                                网络工程相关
                            </a>
                        
                    </div>
                    
                </div>
            </div>

            <div class="post-info">
                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-minus fa-fw"></i>发布日期:&nbsp;&nbsp;
                    2022-11-21
                </div>
                

                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-check fa-fw"></i>更新日期:&nbsp;&nbsp;
                    2023-03-04
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-file-word fa-fw"></i>文章字数:&nbsp;&nbsp;
                    4.7k
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-clock fa-fw"></i>阅读时长:&nbsp;&nbsp;
                    16 分
                </div>
                

                
                    <div id="busuanzi_container_page_pv" class="info-break-policy">
                        <i class="far fa-eye fa-fw"></i>阅读次数:&nbsp;&nbsp;
                        <span id="busuanzi_value_page_pv"></span>
                    </div>
				
            </div>
        </div>
        <hr class="clearfix">

        
        <!-- 是否加载使用自带的 prismjs. -->
        <link rel="stylesheet" href="/shier_jinghuang/libs/prism/prism.min.css">
        

        

        <div class="card-content article-card-content">
            <div id="articleContent">
                <h2 id="生成树协议"><a href="#生成树协议" class="headerlink" title="生成树协议"></a>生成树协议</h2><p>[TOC]</p>
<h3 id="生成树技术概述："><a href="#生成树技术概述：" class="headerlink" title="生成树技术概述："></a>生成树技术概述：</h3><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>以太网交换网络中为了进行链路备份，提高网络可靠性，通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路，引发广播风暴以及MAC地址表不稳定等故障现象，从而导致用户通信质量较差，甚至通信中断。为解决交换网络中的环路问题，提出了生成树协议STP（Spanning Tree Protocol）。</p>
<p>运行STP协议的设备通过彼此交互信息发现网络中的环路，并有选择的对某个接口进行阻塞，最终将环形网络结构修剪成无环路的树形网络结构，从而防止报文在环形网络中不断循环，避免设备由于重复接收相同的报文造成处理能力下降。</p>
<blockquote>
<p style="color:orange;">RSTP(Rapid Spanning Tree Protocol)协议：快速生成树协议，基于STP协议，实现了网络拓扑快速收敛</p>
</blockquote>
<h4 id="二层交换机网络的冗余性与环路"><a href="#二层交换机网络的冗余性与环路" class="headerlink" title="二层交换机网络的冗余性与环路:"></a>二层交换机网络的冗余性与环路:</h4><img src="D:\gitee-blog\source\_posts\生成树协议\二层交换机环路.png" style="zoom:67%;" />

<p>交换机在互连时一般都会使用冗余链路来实现备份。冗余链路虽然增强了网络的可靠性，但是也会产生环路，而环路会带来一系列的问题，继而导致通信质量下降和通信业务中断等问题。</p>
<blockquote>
<ul>
<li><p style="color:blue;">在现实中，除了冗余链路会引起环路，还有一些人为错误导致的环路</p></li>
</ul>
</blockquote>
<h5 id="问题一：广播风暴"><a href="#问题一：广播风暴" class="headerlink" title="问题一：广播风暴:"></a>问题一：广播风暴:</h5><p>如果交换机从一个接口上接收到的是一个广播帧，或者是一个目的MAC地址未知的单播帧，则会将这个帧向除源接口之外的所有其他接口转发。</p>
<blockquote>
<p>如果交换网络中有环路，则这个帧会被无限转发，此时便会形成广播风暴，网络中也会充斥着重复的数据帧</p>
</blockquote>
<h5 id="问题二：MAC地址表漂移"><a href="#问题二：MAC地址表漂移" class="headerlink" title="问题二：MAC地址表漂移"></a>问题二：MAC地址表漂移</h5><p>交换机是根据所接收到的数据帧的源地址和接收接口生成MAC地址表项的。</p>
<img src="D:\gitee-blog\source\_posts\生成树协议\MAC地址表漂移.png" style="zoom:67%;" />

<p>如图，SW3收到一个广播帧泛洪，SW1从GE0/0/1接口接收到广播帧后学习且泛洪，形成MAC地址5489-98EE-788A与GE0/0/1的映射；SW2收到广播帧后学习且泛洪，SW1再次从GE0/0/2收到源MAC地址为5489-98EE-788A的广播帧并进行学习，5489-98EE-788A会不断地在GE0/0/1与GE0/0/2接口之间来回切换，这被称为MAC地址漂移现象。</p>
<p>在网络中部署生成树后，交换机之间会进行生成树协议报文的交互并进行无环拓扑计算，最终将网络中的某个（或某些）接口进行阻塞（Block），从而打破环路</p>
<img src="D:\gitee-blog\source\_posts\生成树协议\生成树协议.png" style="zoom:67%;" />

<p>交换机上运行的生成树协议会持续监控网络的拓扑结构，当网络拓扑结构发生变化时，生成树能感知到这些变化，并且自动做出调整<br>因此，生成树既能解决二层环路问题，也能为网络的冗余性提供一种方案</p>
<h5 id="环路类别："><a href="#环路类别：" class="headerlink" title="环路类别："></a>环路类别：</h5><p>常见环路主要分为<strong>二层环路</strong>和<strong>三层环路</strong>。</p>
<blockquote>
<ol>
<li>二层环路主要因为网络中部署了二层冗余环境，或人为的误接线缆导致，可以通过借助特定的协议或机制实现二层防环；</li>
<li>三层环路主要因为路由环路，可以通过动态路由协议防环和IP报文头部中的TTL字段用于防止报文被无止尽地转发</li>
</ol>
</blockquote>
<h3 id="STP的基本概念及工作原理"><a href="#STP的基本概念及工作原理" class="headerlink" title="STP的基本概念及工作原理"></a>STP的基本概念及工作原理</h3><ul>
<li>选举一个根桥</li>
<li>每个非根交换机选举一个根接口</li>
<li>每个网段选举一个指定接口</li>
<li>阻塞非根、非指定接口</li>
</ul>
<p>每个STP网络中，都会存在一个根桥，其他交换机为非根桥。</p>
<p>根桥或者根交换机位于整个逻辑树的根部，是STP网络的逻辑中心，非根桥是根桥的下游设备。当现有根桥产生故障时，非根桥之间会交互信息并重新选举根桥，交互的这种信息被称为BPDU。</p>
<blockquote>
<p style="color:red;">STP中定义了三种接口角色：指定接口，根接口和预备接口</p>
</blockquote>
<ul>
<li>指定接口是交换机向所连网段转发配置BPDU的接口，每个网段有且只能有一个指定接口。一般情况下，根桥的每个接口总是指定接口。</li>
<li>根接口是非根交换机去往根桥路径最优的接口。在一个运行STP协议的交换机上最多只有一个根接口，但根桥上没有根接口。</li>
<li>如果一个接口既不是指定接口也不是根接口，则此接口为预备接口。预备接口将被阻塞。</li>
</ul>
<h4 id="STP的基本概念："><a href="#STP的基本概念：" class="headerlink" title="STP的基本概念："></a>STP的基本概念：</h4><h5 id="桥ID（Bridge-ID，BID）"><a href="#桥ID（Bridge-ID，BID）" class="headerlink" title="桥ID（Bridge ID，BID）"></a>桥ID（Bridge ID，BID）</h5><p>IEEE 802.1D标准中规定BID由16位的桥优先级（Bridge Priority）与桥MAC地址构成。</p>
<ol>
<li>在STP中，每一台交换机都有一个标示符叫做Bridge ID或者桥ID，桥ID由16位的桥优先级（Bridge-Priority）和48位的MAC地址构成</li>
<li>在STP网络中，桥优先级是可以配置的，取值范围是0～65535，默认值为32768<ul>
<li>可以修改，但是取值必须为4096的倍数。</li>
</ul>
</li>
<li>优先级最高的设备（数值越小越优先）会被选举为根桥<ul>
<li>如果优先级相同，则会比较MAC地址，MAC地址越小则越优先</li>
</ul>
</li>
</ol>
<h5 id="根桥（Root-Bridge）"><a href="#根桥（Root-Bridge）" class="headerlink" title="根桥（Root Bridge）"></a>根桥（Root Bridge）</h5><p>STP引入了根桥（Root Bridge）</p>
<p>对于一个STP网络，全网中只有一个根桥，是整个网络的逻辑中心。根桥会根据网络拓扑的变化而动态变化</p>
<blockquote>
<p style="color:orange;">网络收敛后，根桥会按照一定的时间间隔产生并向外发送配置BPDU，其他设备仅对该报文进行处理，传达拓扑变化记录，从而保证拓扑的稳定</p>
</blockquote>
<h5 id="开销（Cost）"><a href="#开销（Cost）" class="headerlink" title="开销（Cost）"></a>开销（Cost）</h5><blockquote>
<p style="color:skyblue;">每一个激活了STP的接口都维护着一个Cost值，接口的Cost主要用于计算根路径开销，也就是到达根的开销</p>
</blockquote>
<p>接口的缺省Cost除了与其速率、工作模式有关，还与交换机使用的STP Cost计算方法有关。<br>接口带宽越大，则Cost值越小。<br>用户也可以根据需要通过命令调整接口的Cost</p>
<img src="D:\gitee-blog\source\_posts\生成树协议\生成树开销.png" style="zoom: 50%;" />

<h5 id="根路径开销（Root-Path-Cost）"><a href="#根路径开销（Root-Path-Cost）" class="headerlink" title="根路径开销（Root Path Cost）"></a>根路径开销（Root Path Cost）</h5><blockquote>
<p>一台设备从某个接口到达根桥的RPC等于从根桥到该设备沿途所有入方向接口的Cost累加</p>
</blockquote>
<p>非根桥通过对比多条路径的路径开销，选出到达根桥的最短路径，这条最短路径的路径开销被称为RPC，并生成无环树状网络</p>
<p>根桥的根路径开销是0</p>
<h5 id="接口ID（Port-ID，PID）"><a href="#接口ID（Port-ID，PID）" class="headerlink" title="接口ID（Port ID，PID）"></a>接口ID（Port ID，PID）</h5><p>运行STP的交换机使用接口ID来标识每个接口，接口ID主要用于在特定场景下选举指定接口。<br>接口ID由两部分构成的，高4 bit是接口优先级，低12 bit是接口编号。<br>激活STP的接口会维护一个缺省的接口优先级，取值范围是0到240，步长为16，即取值必须为16的整数倍。在华为交换机上，该值为128。用户可以根据实际需要，通过命令修改该优先级。</p>
<h5 id="BPDU（Bridge-Protocol-Data-Unit，网桥协议数据单元）"><a href="#BPDU（Bridge-Protocol-Data-Unit，网桥协议数据单元）" class="headerlink" title="BPDU（Bridge Protocol Data Unit，网桥协议数据单元）"></a>BPDU（Bridge Protocol Data Unit，网桥协议数据单元）</h5><p>BPDU是STP能够正常工作的根本。BPDU是STP的协议报文。<br>STP交换机之间会交互BPDU报文，这些BPDU报文携带着一些重要信息，正是基于这些信息，STP才能够顺利工作。<br>BPDU分为两种类型：</p>
<ul>
<li>配置BPDU（Configuration BPDU）</li>
<li>TCN BPDU（Topology Change Notification BPDU）</li>
</ul>
<blockquote>
<p>配置BPDU是STP进行拓扑计算的关键；TCN BPDU只在网络拓扑发生变更时才会被触发。</p>
</blockquote>
<h4 id="配置BPDU的报文格式"><a href="#配置BPDU的报文格式" class="headerlink" title="配置BPDU的报文格式:"></a>配置BPDU的报文格式:</h4><img src="D:\gitee-blog\source\_posts\生成树协议\BPDU报文格式.png" style="zoom: 67%;" />

<table>
<thead>
<tr>
<th align="center">字节</th>
<th align="left"><strong>字段</strong></th>
<th align="left">描述</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>PID</strong></td>
<td align="left">协议ID ，对于STP而言，该字段的值总为0</td>
</tr>
<tr>
<td align="center"><strong>1</strong></td>
<td align="left"><strong>PVI</strong></td>
<td align="left">协议版本ID，对于STP而言，该字段的值总为0</td>
</tr>
<tr>
<td align="center"><strong>1</strong></td>
<td align="left"><strong>BPDU</strong> <strong>Type</strong></td>
<td align="left">指示本BPDU的类型，若值为0x00，则表示本报文为配置BPDU；若值为0x80，则为TCN BPDU</td>
</tr>
<tr>
<td align="center"><strong>1</strong></td>
<td align="left"><strong>Flags</strong></td>
<td align="left">标志，STP只使用了该字段的最高及最低两个比特位，最低位是TC（Topology Change，拓扑变更）标志，最高位是TCA（Topology Change Acknowledgment，拓扑变更确认）标志</td>
</tr>
<tr>
<td align="center"><strong>8</strong></td>
<td align="left"><strong>Root</strong> <strong>ID</strong></td>
<td align="left">根网桥的桥ID</td>
</tr>
<tr>
<td align="center"><strong>4</strong></td>
<td align="left"><strong>RPC</strong></td>
<td align="left">根路径开销，到达根桥的STP Cost</td>
</tr>
<tr>
<td align="center"><strong>8</strong></td>
<td align="left"><strong>Bridge ID</strong></td>
<td align="left">BPDU发送桥的ID</td>
</tr>
<tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>Port ID</strong></td>
<td align="left">BPDU发送网桥的接口ID（优先级+接口号）</td>
</tr>
<tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>MessageAge</strong></td>
<td align="left">消息寿命，从根网桥发出BPDU之后的秒数，每经过一个网桥都加1，所以它本质上是到达根桥的跳数</td>
</tr>
<tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>Max Age</strong></td>
<td align="left">最大寿命，当一段时间未收到任何BPDU，生存期到达最大寿命时，网桥认为该接口连接的链路发生故障。默认20s</td>
</tr>
<tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>Hello Time</strong></td>
<td align="left">根网桥连续发送的BPDU之间的时间间隔，默认2s</td>
</tr>
<tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>Forward  Delay</strong></td>
<td align="left">转发延迟，在侦听和学习状态所停留的时间间隔，默认15s</td>
</tr>
</tbody></table>
<h5 id="计时器："><a href="#计时器：" class="headerlink" title="计时器："></a>计时器：</h5><p>STP协议中包含一些重要的时间参数</p>
<ol>
<li>Hello Time是指运行STP协议的设备发送配</li>
<li>置BPDU的时间间隔，用于检测链路是否存在故障。交换机每隔Hello Time时间会向周围的交换机发送配置BPDU报文，以确认链路是否存在故障。当网络拓扑稳定后，该值只有在根桥上修改才有效</li>
<li>Message Age:如果配置BPDU是根桥发出的，则Message Age为0。否则，Message Age是从根桥发送到当前桥接收到BPDU的总时间，包括传输延时等。实际实现中，配置BPDU报文每经过一个交换机，Message Age增加1</li>
<li>Max Age是指BPDU报文的老化时间,可在根桥上通过命令人为改动这个值。Max Age通过配置BPDU报文的传递，可以保证Max Age在整网中一致。非根桥设备收到配置BPDU报文后，会将报文中的Message Age和Max Age进行比较：如果Message Age小于等于Max Age，则该非根桥设备会继续转发配置BPDU报文。如果Message Age大于Max Age，则该配置BPDU报文将被老化掉。该非根桥设备将直接丢弃该配置BPDU，并认为是网络直径过大，导致了根桥连接失败。</li>
</ol>
<img src="D:\gitee-blog\source\_posts\生成树协议\BPDU计时器.png" style="zoom:67%;" />

<p>配置BPDU报文每经过一个交换机，Message Age都加1。<br>如果Message Age大于Max Age，非根桥会丢弃该配置BPDU。</p>
<h3 id="STP的基础配置"><a href="#STP的基础配置" class="headerlink" title="STP的基础配置"></a>STP的基础配置</h3><h5 id="配置生成树工作模式："><a href="#配置生成树工作模式：" class="headerlink" title="配置生成树工作模式："></a>配置生成树工作模式：</h5><pre class="line-numbers language-none"><code class="language-none">[Huawei] stp mode &#123; stp | rstp | mstp &#125;<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<blockquote>
<p>交换机支持STP、RSTP和MSTP（Multiple Spanning Tree Protocol）三种生成树工作模式，默认情况工作在MSTP模式。</p>
</blockquote>
<h5 id="配置根桥和备份根桥："><a href="#配置根桥和备份根桥：" class="headerlink" title="配置根桥和备份根桥："></a>配置根桥和备份根桥：</h5><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">[Huawei] stp root primary 
&#x2F;&#x2F;配置当前设备为根桥，缺省情况下，交换机不作为任何生成树的根桥。配置后该设备优先级数值自动为0，并且不能更改设备优先级。
[Huawei] stp root secondary
&#x2F;&#x2F;配置当前交换机为备份根桥，缺省情况下，交换机不作为任何生成树的备份根桥。配置后该设备优先级数值为4096，并且不能更改设备优先级。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<h5 id="配置交换机的STP优先级："><a href="#配置交换机的STP优先级：" class="headerlink" title="配置交换机的STP优先级："></a>配置交换机的STP优先级：</h5><pre class="line-numbers language-none"><code class="language-none">[Huawei] stp priority priority []
# 缺省情况下，交换机的优先级取值是32768<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h5 id="配置接口路径开销"><a href="#配置接口路径开销" class="headerlink" title="配置接口路径开销:"></a>配置接口路径开销:</h5><pre class="line-numbers language-none"><code class="language-none">[Huawei] stp pathcost-standard &#123; dot1d-1998 | dot1t | legacy &#125;
#配置接口路径开销计算方法。缺省情况下，路径开销值的计算方法为IEEE 802.1t标准方法。
#同一网络内所有交换机的接口路径开销应使用相同的计算方法。
[Huawei-GigabitEthernet0&#x2F;0&#x2F;1] stp cost cost
设置当前接口的路径开销值。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h5 id="配置接口优先级"><a href="#配置接口优先级" class="headerlink" title="配置接口优先级:"></a>配置接口优先级:</h5><pre class="line-numbers language-none"><code class="language-none">[Huawei-intf] stp priority priority<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<blockquote>
<p>配置接口的优先级。缺省情况下，交换机接口的优先级取值是128。</p>
</blockquote>
<p>启用STP/RSTP/MSTP</p>
<pre class="line-numbers language-none"><code class="language-none">[Huawei] stp enable<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<blockquote>
<p>使能交换机的STP/RSTP/MSTP功能。缺省情况下，设备的STP/RSTP/MSTP功能处于启用状态。</p>
</blockquote>
<h3 id="RSTP对STP的改进"><a href="#RSTP对STP的改进" class="headerlink" title="RSTP对STP的改进"></a>RSTP对STP的改进</h3><p>IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP（Rapid Spanning-Tree Protocol），RSTP在STP基础上进行了改进，实现了网络拓扑快速收敛。</p>
<p>RSTP（快速生成树）是从STP演化而来的，基本思想一样；当交换网络拓扑结构发生变化时， RSTP可以通过Proposal/Agreement机制更快地恢复网络的连通性。</p>
<p>根据STP的不足，RSTP删除了3种接口状态，新增加了2种接口角色，并且把接口属性充分的按照状态和角色解耦；此外，RSTP还增加了相应的一些增强特性和保护措施，实现网络的稳定和快速收敛。</p>
<blockquote>
<ul>
<li>RSTP是可以向下兼容STP的，但不推荐这样的做，RSTP会失去其快速收敛的优势，而STP慢速收敛的缺点会暴露出来。</li>
</ul>
</blockquote>
<h4 id="RSTP对STP的其他改进"><a href="#RSTP对STP的其他改进" class="headerlink" title="RSTP对STP的其他改进:"></a>RSTP对STP的其他改进:</h4><p>配置BPDU的处理发生变化：</p>
<ol>
<li>拓扑稳定后，配置BPDU报文的发送方式进行了优化；</li>
<li>使用更短的BPDU超时计时；</li>
<li>对处理次等BPDU的方式进行了优化；</li>
</ol>
<p>配置BPDU格式的改变，充分利用了STP协议报文中的Flag字段，明确了接口角色。</p>
<p>RSTP拓扑变化处理：相比于STP进行了优化，加速针对拓扑变更的反应速度。</p>
<h4 id="接口角色不同"><a href="#接口角色不同" class="headerlink" title="接口角色不同"></a>接口角色不同</h4><ul>
<li><p>从配置BPDU报文发送角度来看：</p>
<ul>
<li><p>预备（Alternate）接口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的接口</p>
</li>
<li><p>备份（Backup）接口就是由于学习到自己发送的配置BPDU报文而阻塞的接口</p>
</li>
</ul>
</li>
<li><p>从用户流量角度来看：</p>
<ul>
<li>Alternate接口提供了从指定桥到根的另一条可切换路径，作为根接口的备份接口</li>
<li>Backup接口作为指定接口的备份，提供了另一条从根桥到相应网段的备份通路</li>
</ul>
</li>
</ul>
<blockquote>
<p>通过接口角色的增补，简化了生成树协议的理解及部署</p>
</blockquote>
<h5 id="边缘接口"><a href="#边缘接口" class="headerlink" title="边缘接口:"></a>边缘接口:</h5><blockquote>
<p>如果指定接口位于整个域的边缘，不再与任何交换设备连接，这种接口叫做边缘接口。</p>
</blockquote>
<p>边缘接口一般与用户终端设备直接连接，不与任何交换设备连接。边缘接口正常情况下接收不到配置BPDU报文，不参与RSTP运算，可以由Disabled状态直接转到Forwarding状态，且不经历时延，就像在接口上将STP禁用了一样。但是，一旦边缘接口收到配置BPDU报文，就丧失了边缘接口属性，成为普通STP接口，并重新进行生成树计算，从而引起网络震荡</p>
<img src="D:\gitee-blog\source\_posts\生成树协议\边缘接口.png" style="zoom:67%;" />

<h4 id="接口状态不同"><a href="#接口状态不同" class="headerlink" title="接口状态不同"></a>接口状态不同</h4><ul>
<li><p>RSTP的状态规范把原来的5种状态缩减为3种</p>
<table>
<thead>
<tr>
<th align="left">STP接口状态</th>
<th>RSTP接口状态</th>
<th>接口在拓扑中的角色</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Forwarding</td>
<td>Forwarding</td>
<td>包括根接口、指定接口</td>
</tr>
<tr>
<td align="left">Learning</td>
<td>Learning</td>
<td>包括根接口、指定接口</td>
</tr>
<tr>
<td align="left">Listening</td>
<td>Discarding</td>
<td>包括根接口、指定接口</td>
</tr>
<tr>
<td align="left">Blocking</td>
<td>Discarding</td>
<td>包括Alternate接口、Backup接口</td>
</tr>
<tr>
<td align="left">Disabled</td>
<td>Discarding</td>
<td>包括Disable接口</td>
</tr>
</tbody></table>
<ul>
<li>如果不转发用户流量也不学习MAC地址，那么接口状态就是Discarding状态</li>
<li>如果不转发用户流量但是学习MAC地址，那么接口状态就是Learning状态</li>
<li>如果既转发用户流量又学习MAC地址，那么接口状态就是Forwarding状态</li>
</ul>
</li>
</ul>
<h3 id="生成树技术进阶"><a href="#生成树技术进阶" class="headerlink" title="生成树技术进阶"></a>生成树技术进阶</h3><h4 id="STP-RSTP的缺陷"><a href="#STP-RSTP的缺陷" class="headerlink" title="STP/RSTP的缺陷"></a>STP/RSTP的缺陷</h4><p>所有的VLAN共享一棵生成树</p>
<blockquote>
<ul>
<li><blockquote>
<p style="color:blue;">由于局域网内所有的VLAN共享一棵生成树，因此无法在VLAN间实现数据流量的负载均衡，链路被阻塞后将不承载任何流量，还有可能造成部分VLAN的报文无法转发</p></blockquote>
</li>
</ul>
</blockquote>
<h4 id="VBST：基于VLAN的生成树"><a href="#VBST：基于VLAN的生成树" class="headerlink" title="VBST：基于VLAN的生成树"></a>VBST：基于VLAN的生成树</h4><p>VBST（VLAN-Based Spanning Tree）生成树解决方案。该解决方案中，生成树的形成是基于VLAN的，不同VLAN间可形成相互独立的生成树，不同VLAN内的流量沿着各自的生成树转发，进而可实现流量的负载分担，有效地提高了链路带宽的利用率；消除了网络中可能存在的通信环路；配置和维护简单，可降低配置和维护成本。但如果网络中VLAN的数量较多，为每个VLAN执行独立的生成树计算将耗费交换机大量的资源。</p>
<h5 id="企业网中部署VBST："><a href="#企业网中部署VBST：" class="headerlink" title="企业网中部署VBST："></a>企业网中部署VBST：</h5><ul>
<li>可消除网络中可能存在的通信环路</li>
<li>可实现链路的复用和流量的负载分担，进而有效地提高链路带宽的利用率</li>
<li>配置和维护简单，进而可降低配置和维护成本</li>
</ul>
<blockquote>
<p style="color:blue;">但是如果网络中VLAN的数量较多，为每个VLAN执行独立的生成树计算将耗费交换机大量的资源</p>
</blockquote>
<h4 id="MSTP：多生成树"><a href="#MSTP：多生成树" class="headerlink" title="MSTP：多生成树"></a>MSTP：多生成树</h4><img src="D:\gitee-blog\source\_posts\生成树协议\MSTP多生成树.png" style="zoom:50%;" />

<p>为了弥补STP和RSTP的缺陷，IEEE于2002年发布的802.1s标准定义了MSTP。</p>
<blockquote>
<p>MSTP兼容STP和RSTP，既可以快速收敛，又提供了数据转发的多个冗余路径，在数据转发过程中实现VLAN数据的负载均衡。</p>
</blockquote>
<p>MSTP把一个交换网络划分成多个域，每个域内形成多棵生成树，生成树之间彼此独立。</p>
<ul>
<li>每棵生成树叫做一个多生成树实例MSTI    Multiple Spanning Tree Instance</li>
<li>生成树实例是多个VLAN的集合所对应的生成树</li>
<li>通过将多个VLAN捆绑到一个实例，可以节省通信开销和资源占用率。</li>
<li>MSTP各个实例拓扑的计算相互独立，在这些实例上可以实现负载均衡。</li>
<li>可以把多个相同拓扑结构的VLAN映射到一个实例里，这些VLAN在接口上的转发状态取决于接口在对应实例的状态</li>
</ul>
<img src="D:\gitee-blog\source\_posts\生成树协议\MSTP多生成树.png" style="zoom:50%;" />

<h4 id="堆叠技术："><a href="#堆叠技术：" class="headerlink" title="堆叠技术："></a>堆叠技术：</h4><blockquote>
<p style="color:orange;">堆叠iStack（Intelligent Stack），是指将多台支持堆叠特性的交换机设备组合在一起，从逻辑上组合成一台整体交换设备</p>
</blockquote>
<p>堆叠系统建立之前，每台交换机都是单独的实体，有自己独立的IP地址和MAC地址，对外体现为多台交换机，用户需要独立的管理所有的交换机；堆叠建立后堆叠成员对外体现为一个统一的逻辑实体，用户使用一个IP地址对堆叠中的所有交换机进行管理和维护</p>
<img src="D:\gitee-blog\source\_posts\生成树协议\堆叠技术.png" style="zoom:67%;" />
                
            </div>
            <hr/>

            

    <div class="reprint" id="reprint-statement">
        
            <div class="reprint__author">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-user">
                        文章作者:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="/shier_jinghuang/about" rel="external nofollow noreferrer">十二惊惶</a>
                </span>
            </div>
            <div class="reprint__type">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-link">
                        文章链接:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://im-so-scared-2.gitee.io/shier_jinghuang/shier_jinghuang/2022/11/21/%E7%94%9F%E6%88%90%E6%A0%91%E5%8D%8F%E8%AE%AE/">https://im-so-scared-2.gitee.io/shier_jinghuang/shier_jinghuang/2022/11/21/%E7%94%9F%E6%88%90%E6%A0%91%E5%8D%8F%E8%AE%AE/</a>
                </span>
            </div>
            <div class="reprint__notice">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-copyright">
                        版权声明:
                    </i>
                </span>
                <span class="reprint-info">
                    本博客所有文章除特別声明外，均采用
                    <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a>
                    许可协议。转载请注明来源
                    <a href="/shier_jinghuang/about" target="_blank">十二惊惶</a>
                    !
                </span>
            </div>
        
    </div>

    <script async defer>
      document.addEventListener("copy", function (e) {
        let toastHTML = '<span>复制成功，请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>';
        M.toast({html: toastHTML})
      });

      function navToReprintStatement() {
        $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800);
      }
    </script>



            <div class="tag_share" style="display: block;">
                <div class="post-meta__tag-list" style="display: inline-block;">
                    
                        <div class="article-tag">
                            
                                <a href="/shier_jinghuang/tags/HCIP/">
                                    <span class="chip bg-color">HCIP</span>
                                </a>
                            
                        </div>
                    
                </div>
                <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;">
                    <link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/share/css/share.min.css">
<div id="article-share">

    
    <div class="social-share" data-sites="twitter,facebook,google,qq,qzone,wechat,weibo,douban,linkedin" data-wechat-qrcode-helper="<p>微信扫一扫即可分享！</p>"></div>
    <script src="/shier_jinghuang/libs/share/js/social-share.min.js"></script>
    

    

</div>

                </div>
            </div>
            
        </div>
    </div>

    

    

    

    

    

    

    

    

    

<article id="prenext-posts" class="prev-next articles">
    <div class="row article-row">
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge left-badge text-color">
                <i class="fas fa-chevron-left"></i>&nbsp;上一篇</div>
            <div class="card">
                <a href="/shier_jinghuang/2022/11/24/%E7%BD%91%E7%BB%9C%E6%94%BB%E5%87%BB%E4%B8%8E%E9%98%B2%E8%8C%83/">
                    <div class="card-image">
                        
                        
                        <img src="/shier_jinghuang/medias/featureimages/20.jpg" class="responsive-img" alt="网络攻击与防范">
                        
                        <span class="card-title">网络攻击与防范</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                        <span class="publish-date">
                            <i class="far fa-clock fa-fw icon-date"></i>2022-11-24
                        </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/shier_jinghuang/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/" class="post-category">
                                    网络安全
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/shier_jinghuang/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">
                        <span class="chip bg-color">网络安全</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge right-badge text-color">
                下一篇&nbsp;<i class="fas fa-chevron-right"></i>
            </div>
            <div class="card">
                <a href="/shier_jinghuang/2022/11/18/HTTP%E5%8D%8F%E8%AE%AE/">
                    <div class="card-image">
                        
                        
                        <img src="/shier_jinghuang/medias/featureimages/20.jpg" class="responsive-img" alt="超文本传输协议HTTP">
                        
                        <span class="card-title">超文本传输协议HTTP</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                            <span class="publish-date">
                                <i class="far fa-clock fa-fw icon-date"></i>2022-11-18
                            </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/shier_jinghuang/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B%E7%9B%B8%E5%85%B3/" class="post-category">
                                    网络工程相关
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/shier_jinghuang/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/">
                        <span class="chip bg-color">网络协议分析</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
    </div>
</article>

</div>



<!-- 代码块功能依赖 -->
<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeBlockFuction.js"></script>


  <!-- 是否加载使用自带的 prismjs. -->
  <script type="text/javascript" src="/shier_jinghuang/libs/prism/prism.min.js"></script>


<!-- 代码语言 -->

<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeLang.js"></script>


<!-- 代码块复制 -->

<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeCopy.js"></script>


<!-- 代码块收缩 -->

<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeShrink.js"></script>



    </div>
    <div id="toc-aside" class="expanded col l3 hide-on-med-and-down">
        <div class="toc-widget card" style="background-color: white;">
            <div class="toc-title"><i class="far fa-list-alt"></i>&nbsp;&nbsp;目录</div>
            <div id="toc-content"></div>
        </div>
    </div>
</div>

<!-- TOC 悬浮按钮. -->

<div id="floating-toc-btn" class="hide-on-med-and-down">
    <a class="btn-floating btn-large bg-color">
        <i class="fas fa-list-ul"></i>
    </a>
</div>


<script src="/shier_jinghuang/libs/tocbot/tocbot.min.js"></script>
<script>
    $(function () {
        tocbot.init({
            tocSelector: '#toc-content',
            contentSelector: '#articleContent',
            headingsOffset: -($(window).height() * 0.4 - 45),
            collapseDepth: Number('0'),
            headingSelector: 'h2, h3, h4'
        });

        // Set scroll toc fixed.
        let tocHeight = parseInt($(window).height() * 0.4 - 64);
        let $tocWidget = $('.toc-widget');
        $(window).scroll(function () {
            let scroll = $(window).scrollTop();
            /* add post toc fixed. */
            if (scroll > tocHeight) {
                $tocWidget.addClass('toc-fixed');
            } else {
                $tocWidget.removeClass('toc-fixed');
            }
        });

        
        /* 修复文章卡片 div 的宽度. */
        let fixPostCardWidth = function (srcId, targetId) {
            let srcDiv = $('#' + srcId);
            if (srcDiv.length === 0) {
                return;
            }

            let w = srcDiv.width();
            if (w >= 450) {
                w = w + 21;
            } else if (w >= 350 && w < 450) {
                w = w + 18;
            } else if (w >= 300 && w < 350) {
                w = w + 16;
            } else {
                w = w + 14;
            }
            $('#' + targetId).width(w);
        };

        // 切换TOC目录展开收缩的相关操作.
        const expandedClass = 'expanded';
        let $tocAside = $('#toc-aside');
        let $mainContent = $('#main-content');
        $('#floating-toc-btn .btn-floating').click(function () {
            if ($tocAside.hasClass(expandedClass)) {
                $tocAside.removeClass(expandedClass).hide();
                $mainContent.removeClass('l9');
            } else {
                $tocAside.addClass(expandedClass).show();
                $mainContent.addClass('l9');
            }
            fixPostCardWidth('artDetail', 'prenext-posts');
        });
        
    });
</script>

    

</main>




    <footer class="page-footer bg-color">
    
        <link rel="stylesheet" href="/shier_jinghuang/libs/aplayer/APlayer.min.css">
<style>
    .aplayer .aplayer-lrc p {
        
        display: none;
        
        font-size: 12px;
        font-weight: 700;
        line-height: 16px !important;
    }

    .aplayer .aplayer-lrc p.aplayer-lrc-current {
        
        display: none;
        
        font-size: 15px;
        color: #42b983;
    }

    
    .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body {
        left: -66px !important;
    }

    .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body:hover {
        left: 0px !important;
    }

    
</style>
<div class="">
    
    <div class="row">
        <meting-js class="col l8 offset-l2 m10 offset-m1 s12"
                   server="netease"
                   type="playlist"
                   id="503838841"
                   fixed='true'
                   autoplay='false'
                   theme='#42b983'
                   loop='all'
                   order='random'
                   preload='auto'
                   volume='0.7'
                   list-folded='true'
        >
        </meting-js>
    </div>
</div>

<script src="/shier_jinghuang/libs/aplayer/APlayer.min.js"></script>
<script src="/shier_jinghuang/libs/aplayer/Meting.min.js"></script>

    

    <div class="container row center-align"
         style="margin-bottom: 0px !important;">
        <div class="col s12 m8 l8 copy-right">
            Copyright&nbsp;&copy;
            
                <span id="year">2019-2023</span>
            
            <a href="/shier_jinghuang/about" target="_blank">十二惊惶</a>
            |&nbsp;Powered by&nbsp;<a href="https://hexo.io/" target="_blank">Hexo</a>
            |&nbsp;Theme&nbsp;<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a>
            <br>
            
                &nbsp;<i class="fas fa-chart-area"></i>&nbsp;站点总字数:&nbsp;<span
                        class="white-color">289.6k</span>
            
            
            
                
            
            
                <span id="busuanzi_container_site_pv">
                &nbsp;|&nbsp;<i class="far fa-eye"></i>&nbsp;总访问量:&nbsp;
                    <span id="busuanzi_value_site_pv" class="white-color"></span>
            </span>
            
            
                <span id="busuanzi_container_site_uv">
                &nbsp;|&nbsp;<i class="fas fa-users"></i>&nbsp;总访问人数:&nbsp;
                    <span id="busuanzi_value_site_uv" class="white-color"></span>
            </span>
            
            <br>

            <!-- 运行天数提醒. -->
            
            <br>
            
        </div>
        <div class="col s12 m4 l4 social-link social-statis">
    <a href="https://github.com/blinkfox" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
        <i class="fab fa-github"></i>
    </a>



    <a href="mailto:1181062873@qq.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50">
        <i class="fas fa-envelope-open"></i>
    </a>







    <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=1181062873" class="tooltipped" target="_blank" data-tooltip="QQ联系我: 1181062873" data-position="top" data-delay="50">
        <i class="fab fa-qq"></i>
    </a>







    <a href="/shier_jinghuang/atom.xml" class="tooltipped" target="_blank" data-tooltip="RSS 订阅" data-position="top" data-delay="50">
        <i class="fas fa-rss"></i>
    </a>

</div>
    </div>
</footer>

<div class="progress-bar"></div>


    <!-- 搜索遮罩框 -->
<div id="searchModal" class="modal">
    <div class="modal-content">
        <div class="search-header">
            <span class="title"><i class="fas fa-search"></i>&nbsp;&nbsp;搜索</span>
            <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字"
                   class="search-input">
        </div>
        <div id="searchResult"></div>
    </div>
</div>

<script type="text/javascript">
$(function () {
    var searchFunc = function (path, search_id, content_id) {
        'use strict';
        $.ajax({
            url: path,
            dataType: "xml",
            success: function (xmlResponse) {
                // get the contents from search data
                var datas = $("entry", xmlResponse).map(function () {
                    return {
                        title: $("title", this).text(),
                        content: $("content", this).text(),
                        url: $("url", this).text()
                    };
                }).get();
                var $input = document.getElementById(search_id);
                var $resultContent = document.getElementById(content_id);
                $input.addEventListener('input', function () {
                    var str = '<ul class=\"search-result-list\">';
                    var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/);
                    $resultContent.innerHTML = "";
                    if (this.value.trim().length <= 0) {
                        return;
                    }
                    // perform local searching
                    datas.forEach(function (data) {
                        var isMatch = true;
                        var data_title = data.title.trim().toLowerCase();
                        var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase();
                        var data_url = data.url;
                        data_url = data_url.indexOf('/') === 0 ? data.url : '/' + data_url;
                        var index_title = -1;
                        var index_content = -1;
                        var first_occur = -1;
                        // only match artiles with not empty titles and contents
                        if (data_title !== '' && data_content !== '') {
                            keywords.forEach(function (keyword, i) {
                                index_title = data_title.indexOf(keyword);
                                index_content = data_content.indexOf(keyword);
                                if (index_title < 0 && index_content < 0) {
                                    isMatch = false;
                                } else {
                                    if (index_content < 0) {
                                        index_content = 0;
                                    }
                                    if (i === 0) {
                                        first_occur = index_content;
                                    }
                                }
                            });
                        }
                        // show search results
                        if (isMatch) {
                            str += "<li><a href='" + data_url + "' class='search-result-title'>" + data_title + "</a>";
                            var content = data.content.trim().replace(/<[^>]+>/g, "");
                            if (first_occur >= 0) {
                                // cut out 100 characters
                                var start = first_occur - 20;
                                var end = first_occur + 80;
                                if (start < 0) {
                                    start = 0;
                                }
                                if (start === 0) {
                                    end = 100;
                                }
                                if (end > content.length) {
                                    end = content.length;
                                }
                                var match_content = content.substr(start, end);
                                // highlight all keywords
                                keywords.forEach(function (keyword) {
                                    var regS = new RegExp(keyword, "gi");
                                    match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>");
                                });

                                str += "<p class=\"search-result\">" + match_content + "...</p>"
                            }
                            str += "</li>";
                        }
                    });
                    str += "</ul>";
                    $resultContent.innerHTML = str;
                });
            }
        });
    };

    searchFunc('/shier_jinghuang/search.xml', 'searchInput', 'searchResult');
});
</script>

    <!-- 白天和黑夜主题 -->
<div class="stars-con">
    <div id="stars"></div>
    <div id="stars2"></div>
    <div id="stars3"></div>  
</div>

<script>
    function switchNightMode() {
        $('<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>').appendTo($('body')),
        setTimeout(function () {
            $('body').hasClass('DarkMode') 
            ? ($('body').removeClass('DarkMode'), localStorage.setItem('isDark', '0'), $('#sum-moon-icon').removeClass("fa-sun").addClass('fa-moon')) 
            : ($('body').addClass('DarkMode'), localStorage.setItem('isDark', '1'), $('#sum-moon-icon').addClass("fa-sun").removeClass('fa-moon')),
            
            setTimeout(function () {
            $('.Cuteen_DarkSky').fadeOut(1e3, function () {
                $(this).remove()
            })
            }, 2e3)
        })
    }
</script>

    <!-- 回到顶部按钮 -->
<div id="backTop" class="top-scroll">
    <a class="btn-floating btn-large waves-effect waves-light" href="#!">
        <i class="fas fa-arrow-up"></i>
    </a>
</div>


    <script src="/shier_jinghuang/libs/materialize/materialize.min.js"></script>
    <script src="/shier_jinghuang/libs/masonry/masonry.pkgd.min.js"></script>
    <script src="/shier_jinghuang/libs/aos/aos.js"></script>
    <script src="/shier_jinghuang/libs/scrollprogress/scrollProgress.min.js"></script>
    <script src="/shier_jinghuang/libs/lightGallery/js/lightgallery-all.min.js"></script>
    <script src="/shier_jinghuang/js/matery.js"></script>

    

    

    <!-- 雪花特效 -->
    

    <!-- 鼠标星星特效 -->
    

     
        <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
        <script src="/shier_jinghuang/libs/others/TencentCaptcha.js"></script>
        <button id="TencentCaptcha" data-appid="xxxxxxxxxx" data-cbfn="callback" type="button" hidden></button>
    

    <!-- Baidu Analytics -->

    <!-- Baidu Push -->

<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        } else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>

    
    <script src="/shier_jinghuang/libs/others/clicklove.js" async="async"></script>
    
    
    <script async src="/shier_jinghuang/libs/others/busuanzi.pure.mini.js"></script>
    

    

    

    <!--腾讯兔小巢-->
    
    

    

    

    
    <script src="/shier_jinghuang/libs/instantpage/instantpage.js" type="module"></script>
    

</body>

</html>
